<!DOCTYPE HTML>
<html lang="en" class="sidebar-visible no-js coal">
    <head>
        <!-- Book generated using mdBook -->
        <meta charset="UTF-8">
        <title>learn swift basics - Andrew&#x27;s Blog</title>


        <!-- Custom HTML head -->
        
        <meta name="description" content="Andrew Ryan&#x27;s Blog">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="theme-color" content="#ffffff" />

        <link rel="icon" href="../../favicon.svg">
        <link rel="shortcut icon" href="../../favicon.png">
        <link rel="stylesheet" href="../../css/variables.css">
        <link rel="stylesheet" href="../../css/general.css">
        <link rel="stylesheet" href="../../css/chrome.css">

        <!-- Fonts -->
        <link rel="stylesheet" href="../../FontAwesome/css/font-awesome.css">
        <link rel="stylesheet" href="../../fonts/fonts.css">

        <!-- Highlight.js Stylesheets -->
        <link rel="stylesheet" href="../../highlight.css">
        <link rel="stylesheet" href="../../tomorrow-night.css">
        <link rel="stylesheet" href="../../ayu-highlight.css">

        <!-- Custom theme stylesheets -->
        <link rel="stylesheet" href="../../src/style/custom.css">

        <!-- MathJax -->
        <script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
    </head>
    <body>
    <div id="body-container">
        <!-- Provide site root to javascript -->
        <script>
            var path_to_root = "../../";
            var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "coal" : "coal";
        </script>

        <!-- Work around some values being stored in localStorage wrapped in quotes -->
        <script>
            try {
                var theme = localStorage.getItem('mdbook-theme');
                var sidebar = localStorage.getItem('mdbook-sidebar');

                if (theme.startsWith('"') && theme.endsWith('"')) {
                    localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
                }

                if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
                    localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
                }
            } catch (e) { }
        </script>

        <!-- Set the theme before any content is loaded, prevents flash -->
        <script>
            var theme;
            try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
            if (theme === null || theme === undefined) { theme = default_theme; }
            var html = document.querySelector('html');
            html.classList.remove('no-js')
            html.classList.remove('coal')
            html.classList.add(theme);
            html.classList.add('js');
        </script>

        <!-- Hide / unhide sidebar before it is displayed -->
        <script>
            var html = document.querySelector('html');
            var sidebar = null;
            if (document.body.clientWidth >= 1080) {
                try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
                sidebar = sidebar || 'visible';
            } else {
                sidebar = 'hidden';
            }
            html.classList.remove('sidebar-visible');
            html.classList.add("sidebar-" + sidebar);
        </script>

        <nav id="sidebar" class="sidebar" aria-label="Table of contents">
            <div class="sidebar-scrollbox">
                <ol class="chapter"><li class="chapter-item affix "><a href="../../index.html">Andrew's Blog</a></li><li class="chapter-item "><a href="../../posts/linux/linux.html"><strong aria-hidden="true">1.</strong> Linux</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/linux/install_linux.html"><strong aria-hidden="true">1.1.</strong> install linux</a></li><li class="chapter-item "><a href="../../posts/linux/bash_profile.html"><strong aria-hidden="true">1.2.</strong> bash profile</a></li><li class="chapter-item "><a href="../../posts/linux/command_list.html"><strong aria-hidden="true">1.3.</strong> command list</a></li><li class="chapter-item "><a href="../../posts/linux/git_guide.html"><strong aria-hidden="true">1.4.</strong> git guide</a></li><li class="chapter-item "><a href="../../posts/linux/tar.html"><strong aria-hidden="true">1.5.</strong> tar</a></li><li class="chapter-item "><a href="../../posts/Linux/git_cheatsheet.html"><strong aria-hidden="true">1.6.</strong> Git Cheatsheet</a></li><li class="chapter-item "><a href="../../posts/Linux/bash_cheatsheet.html"><strong aria-hidden="true">1.7.</strong> Bash Cheatsheet</a></li></ol></li><li class="chapter-item "><a href="../../posts/macos/mac.html"><strong aria-hidden="true">2.</strong> MacOS</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/macos/macos_profiles.html"><strong aria-hidden="true">2.1.</strong> macos profiles</a></li><li class="chapter-item "><a href="../../posts/macos/macos_pwn_env_setup.html"><strong aria-hidden="true">2.2.</strong> macos pwn env setup</a></li></ol></li><li class="chapter-item expanded "><a href="../../posts/swift/swift.html"><strong aria-hidden="true">3.</strong> Swift</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../../posts/swift/learn_swift.html" class="active"><strong aria-hidden="true">3.1.</strong> learn swift basics</a></li><li class="chapter-item "><a href="../../posts/swift/swift_extensions.html"><strong aria-hidden="true">3.2.</strong> Swift extensions</a></li><li class="chapter-item "><a href="../../posts/swift/swiftui_extension.html"><strong aria-hidden="true">3.3.</strong> SwiftUI extensions</a></li><li class="chapter-item "><a href="../../posts/swift/install_swift.html"><strong aria-hidden="true">3.4.</strong> install swift</a></li><li class="chapter-item "><a href="../../posts/swift/task_planner.html"><strong aria-hidden="true">3.5.</strong> implment task panner app with SwiftUI</a></li><li class="chapter-item "><a href="../../posts/swift/swift_cheat_sheet.html"><strong aria-hidden="true">3.6.</strong> Swift Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/swift/yinci_url.html"><strong aria-hidden="true">3.7.</strong> Personal privacy protocol</a></li><li class="chapter-item "><a href="../../posts/swift/swift_regular_exressions.html"><strong aria-hidden="true">3.8.</strong> Swift regular exressions</a></li><li class="chapter-item "><a href="../../posts/ios/how_to_create_beautiful_ios_charts_in_swift.html"><strong aria-hidden="true">3.9.</strong> How to Create Beautiful iOS Charts in Swift</a></li><li class="chapter-item "><a href="../../posts/swift/swiftui_source_code.html"><strong aria-hidden="true">3.10.</strong> SwiftUI source code</a></li><li class="chapter-item "><a href="../../posts/swift/use_swift_fetch_iciba_api.html"><strong aria-hidden="true">3.11.</strong> use swift fetch iciba API</a></li></ol></li><li class="chapter-item "><a href="../../posts/ios/ios.html"><strong aria-hidden="true">4.</strong> iOS</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/ios/cocaposd_setup_and_install_for_ios_project.html"><strong aria-hidden="true">4.1.</strong> cocaposd setup and install for ios project</a></li><li class="chapter-item "><a href="../../posts/ios/swiftui_show_gif_image.html"><strong aria-hidden="true">4.2.</strong> SwiftUI show gif image</a></li><li class="chapter-item "><a href="../../posts/ios/implement_task_planner_app.html"><strong aria-hidden="true">4.3.</strong> implement Task planner App</a></li></ol></li><li class="chapter-item "><a href="../../posts/objective_c/objective_c.html"><strong aria-hidden="true">5.</strong> Objective-C</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/objective_c/objective_c_cheat_sheet.html"><strong aria-hidden="true">5.1.</strong> Objective-C Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/objective_c/objective_c_for_absolute_beginners_read_note.html"><strong aria-hidden="true">5.2.</strong> Objective-C Note</a></li></ol></li><li class="chapter-item "><a href="../../posts/dart/dart.html"><strong aria-hidden="true">6.</strong> Dart</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/dart/flutter.html"><strong aria-hidden="true">6.1.</strong> Flutter Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/dart/dart_cheat_sheet.html"><strong aria-hidden="true">6.2.</strong> Dart Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/flutter/flutter_dev_test.html"><strong aria-hidden="true">6.3.</strong> Flutter dev test</a></li></ol></li><li class="chapter-item "><a href="../../posts/rust/rust.html"><strong aria-hidden="true">7.</strong> Rust</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/rust/offline_use_rust.html"><strong aria-hidden="true">7.1.</strong> Offline use rust</a></li><li class="chapter-item "><a href="../../posts/rust/rust_grammer.html"><strong aria-hidden="true">7.2.</strong> rust grammar</a></li><li class="chapter-item "><a href="../../posts/rust/pase_string_and_decimal_conversion.html"><strong aria-hidden="true">7.3.</strong> pase string and decimal conversion</a></li><li class="chapter-item "><a href="../../posts/rust/parse_types.html"><strong aria-hidden="true">7.4.</strong> rust types</a></li><li class="chapter-item "><a href="../../posts/rust/rust_life_cycle.html"><strong aria-hidden="true">7.5.</strong> Rust life cycle</a></li><li class="chapter-item "><a href="../../posts/rust/rust_generic.html"><strong aria-hidden="true">7.6.</strong> rust generics</a></li><li class="chapter-item "><a href="../../posts/rust/rust_implment_matrix.html"><strong aria-hidden="true">7.7.</strong> Rust implement matrix</a></li><li class="chapter-item "><a href="../../posts/rust/rust_sort.html"><strong aria-hidden="true">7.8.</strong> Rust implement sort algorithms</a></li><li class="chapter-item "><a href="../../posts/rust/implement_aes_encryption.html"><strong aria-hidden="true">7.9.</strong> Rust implement AEC encryption and decryption</a></li><li class="chapter-item "><a href="../../posts/rust/implement_trie_data_structure.html"><strong aria-hidden="true">7.10.</strong> implement trie data structure</a></li><li class="chapter-item "><a href="../../posts/rust/rust_implement_tree.html"><strong aria-hidden="true">7.11.</strong> implement tree data_structure</a></li><li class="chapter-item "><a href="../../posts/rust/list_dir.html"><strong aria-hidden="true">7.12.</strong> list dir</a></li><li class="chapter-item "><a href="../../posts/rust/fast_way_to_implment_object_trait.html"><strong aria-hidden="true">7.13.</strong> fast way to implment object trait</a></li><li class="chapter-item "><a href="../../posts/rust/compress_rust_binary_size.html"><strong aria-hidden="true">7.14.</strong> compress rust binary size</a></li><li class="chapter-item "><a href="../../posts/rust/implment_file_upload_backend.html"><strong aria-hidden="true">7.15.</strong> impliment file upload</a></li><li class="chapter-item "><a href="../../posts/rust/this_is_add_post_cli_implementation_in_rust.html"><strong aria-hidden="true">7.16.</strong> this is add_post cli implementation in rust</a></li><li class="chapter-item "><a href="../../posts/rust/use_rust_implment_a_copyclipbord_cli.html"><strong aria-hidden="true">7.17.</strong> Use rust implment a copyclipbord CLI</a></li><li class="chapter-item "><a href="../../posts/rust/sqlite_database_add_delete_update_show_in_rust.html"><strong aria-hidden="true">7.18.</strong> sqlite database add delete update show in rust</a></li><li class="chapter-item "><a href="../../posts/rust/implementing_tokio_joinhandle_for_wasm.html"><strong aria-hidden="true">7.19.</strong> Implementing tokio JoinHandle for wasm</a></li><li class="chapter-item "><a href="../../posts/rust/rust_implement_a_crate_for_encode_and_decode_brainfuck_and_ook.html"><strong aria-hidden="true">7.20.</strong> rust implement a crate for encode and decode brainfuck and ook</a></li><li class="chapter-item "><a href="../../posts/rust/slint_builtin_elements.html"><strong aria-hidden="true">7.21.</strong> Slint Builtin Elements</a></li><li class="chapter-item "><a href="../../posts/rust/corporate_network_install_rust_on_windows.html"><strong aria-hidden="true">7.22.</strong> Corporate network install Rust on windows</a></li><li class="chapter-item "><a href="../../posts/rust/rust_binary_file_how_to_judge_static_link_or_dynamic_link_in_macos.html"><strong aria-hidden="true">7.23.</strong> rust binary file how to judge static link or dynamic link in Macos</a></li><li class="chapter-item "><a href="../../posts/rust/rust_binary_include_dir_and_get_contents.html"><strong aria-hidden="true">7.24.</strong> rust binary include dir and get contents</a></li><li class="chapter-item "><a href="../../posts/rust/how_to_create_yolov8_based_object_detection_web_service_using_python,_julia,_node.js,_javascript,_go_and_rust.html"><strong aria-hidden="true">7.25.</strong> How to create YOLOv8-based object detection web service using Python, Julia, Node.js, JavaScript, Go and Rust</a></li><li class="chapter-item "><a href="../../posts/rust/implment_builder_proc_macro_for_command_struct.html"><strong aria-hidden="true">7.26.</strong> implment Builder proc-macro for Command struct</a></li></ol></li><li class="chapter-item "><a href="../../posts/java/java.html"><strong aria-hidden="true">8.</strong> Java</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/java/java_grammar.html"><strong aria-hidden="true">8.1.</strong> java grammar and codewar</a></li><li class="chapter-item "><a href="../../posts/java/run_jar.html"><strong aria-hidden="true">8.2.</strong> java run .jar</a></li><li class="chapter-item "><a href="../../posts/java/java_pomxml_add_defaultgoal_to_build.html"><strong aria-hidden="true">8.3.</strong> Java pomxml add defaultGoal to build</a></li><li class="chapter-item "><a href="../../posts/java/java_set_mvn_mirror.html"><strong aria-hidden="true">8.4.</strong> Java set mvn mirror</a></li></ol></li><li class="chapter-item "><a href="../../posts/python/python.html"><strong aria-hidden="true">9.</strong> Python</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/python/convert_pesn.html"><strong aria-hidden="true">9.1.</strong> convert pesn</a></li><li class="chapter-item "><a href="../../posts/python/find_remove_dir.html"><strong aria-hidden="true">9.2.</strong> find and remove dir</a></li><li class="chapter-item "><a href="../../posts/python/timing_message.html"><strong aria-hidden="true">9.3.</strong> wechat send message</a></li><li class="chapter-item "><a href="../../posts/python/use_python_openpyxl_package_read_and_edit_excel_files.html"><strong aria-hidden="true">9.4.</strong> Use python openpyxl package read and edit excel files</a></li><li class="chapter-item "><a href="../../posts/python/sanctum_model_yaml.html"><strong aria-hidden="true">9.5.</strong> sanctum model yaml</a></li><li class="chapter-item "><a href="../../posts/python/how_to_detect_objects_on_images_using_the_yolov8_neural_network.html"><strong aria-hidden="true">9.6.</strong> How to detect objects on images using the YOLOv8 neural network</a></li><li class="chapter-item "><a href="../../posts/python/use_huggingface_model.html"><strong aria-hidden="true">9.7.</strong> use huggingface model</a></li></ol></li><li class="chapter-item "><a href="../../posts/go/go.html"><strong aria-hidden="true">10.</strong> Go</a></li><li class="chapter-item "><a href="../../posts/javascript/js.html"><strong aria-hidden="true">11.</strong> Javascript</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/javascript/js_tutorial.html"><strong aria-hidden="true">11.1.</strong> js tutorial</a></li><li class="chapter-item "><a href="../../posts/javascript/js_tutorial_map.html"><strong aria-hidden="true">11.2.</strong> ja map</a></li><li class="chapter-item "><a href="../../posts/javascript/js_tutorial_math.html"><strong aria-hidden="true">11.3.</strong> js math</a></li><li class="chapter-item "><a href="../../posts/javascript/js_tutorial_object.html"><strong aria-hidden="true">11.4.</strong> js object</a></li><li class="chapter-item "><a href="../../posts/javascript/js_tutorial_set.html"><strong aria-hidden="true">11.5.</strong> js set</a></li><li class="chapter-item "><a href="../../posts/javascript/single_thread_and_asynchronous.html"><strong aria-hidden="true">11.6.</strong> single thread and asynchronous</a></li><li class="chapter-item "><a href="../../posts/javascript/this.html"><strong aria-hidden="true">11.7.</strong> js this</a></li><li class="chapter-item "><a href="../../posts/javascript/js_implment_aes.html"><strong aria-hidden="true">11.8.</strong> js implment aes</a></li><li class="chapter-item "><a href="../../posts/javascript/getting_started_with_ajax.html"><strong aria-hidden="true">11.9.</strong> getting started with ajax</a></li><li class="chapter-item "><a href="../../posts/javascript/BinarySearchTree.html"><strong aria-hidden="true">11.10.</strong> binary search tree</a></li><li class="chapter-item "><a href="../../posts/javascript/goole_zx.html"><strong aria-hidden="true">11.11.</strong> goole zx</a></li><li class="chapter-item "><a href="../../posts/javascript/es6.html"><strong aria-hidden="true">11.12.</strong> es6</a></li></ol></li><li class="chapter-item "><a href="../../posts/ruby/ruby.html"><strong aria-hidden="true">12.</strong> Ruby</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/ruby/rails_setup_env.html"><strong aria-hidden="true">12.1.</strong> ruby on rails setup environment</a></li><li class="chapter-item "><a href="../../posts/ruby/learn_ruby.html"><strong aria-hidden="true">12.2.</strong> learn ruby</a></li><li class="chapter-item "><a href="../../posts/ruby/ruby_note.html"><strong aria-hidden="true">12.3.</strong> Ruby Note</a></li><li class="chapter-item "><a href="../../posts/ruby/setup_ruby_for_ctf.html"><strong aria-hidden="true">12.4.</strong> Setup ruby for CTF</a></li></ol></li><li class="chapter-item "><a href="../../posts/react/react.html"><strong aria-hidden="true">13.</strong> React</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/react/react_life_cycle.html"><strong aria-hidden="true">13.1.</strong> react life cycle</a></li><li class="chapter-item "><a href="../../posts/react/react_router.html"><strong aria-hidden="true">13.2.</strong> react router</a></li><li class="chapter-item "><a href="../../posts/react/react_this.html"><strong aria-hidden="true">13.3.</strong> react this</a></li><li class="chapter-item "><a href="../../posts/react/react_interviw.html"><strong aria-hidden="true">13.4.</strong> react interview</a></li><li class="chapter-item "><a href="../../posts/react/important_react_interview.html"><strong aria-hidden="true">13.5.</strong> important react interview</a></li><li class="chapter-item "><a href="../../posts/react/react_quick_reference.html"><strong aria-hidden="true">13.6.</strong> react quick reference</a></li><li class="chapter-item "><a href="../../posts/react/redux_quick_reference.html"><strong aria-hidden="true">13.7.</strong> redux quick reference</a></li></ol></li><li class="chapter-item "><a href="../../posts/vue/vue.html"><strong aria-hidden="true">14.</strong> Vue</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/vue/vue_ajax.html"><strong aria-hidden="true">14.1.</strong> vue ajax</a></li></ol></li><li class="chapter-item "><a href="../../posts/angular/angular.html"><strong aria-hidden="true">15.</strong> Angular</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/angular/controller_communication.html"><strong aria-hidden="true">15.1.</strong> controller communication</a></li><li class="chapter-item "><a href="../../posts/angular/creating_custom_directives.html"><strong aria-hidden="true">15.2.</strong> creating custom directives</a></li><li class="chapter-item "><a href="../../posts/angular/directive_notes.html"><strong aria-hidden="true">15.3.</strong> directive notes</a></li><li class="chapter-item "><a href="../../posts/angular/directive_communication.html"><strong aria-hidden="true">15.4.</strong> directive communication</a></li><li class="chapter-item "><a href="../../posts/angular/post_params.html"><strong aria-hidden="true">15.5.</strong> post params</a></li><li class="chapter-item "><a href="../../posts/angular/read_json_angular.html"><strong aria-hidden="true">15.6.</strong> read json angular</a></li><li class="chapter-item "><a href="../../posts/angular/same_route_reload.html"><strong aria-hidden="true">15.7.</strong> same route reload</a></li></ol></li><li class="chapter-item "><a href="../../posts/css/css.html"><strong aria-hidden="true">16.</strong> Css</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/css/use_css_media.html"><strong aria-hidden="true">16.1.</strong> use css media</a></li></ol></li><li class="chapter-item "><a href="../../posts/php/php.html"><strong aria-hidden="true">17.</strong> Php</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/php/for_php_string_implment_some_extemtion_functions.html"><strong aria-hidden="true">17.1.</strong> for php string implment some extemtion functions</a></li><li class="chapter-item "><a href="../../posts/php/php_cheatsheet.html"><strong aria-hidden="true">17.2.</strong> PHP cheatsheet</a></li></ol></li><li class="chapter-item "><a href="../../posts/windows/windows.html"><strong aria-hidden="true">18.</strong> Windows</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/windows/windows.html"><strong aria-hidden="true">18.1.</strong> Windows</a></li><li class="chapter-item "><a href="../../posts/windows/windows10_use_powershell_dedup_redundent_path.html"><strong aria-hidden="true">18.2.</strong> Windows10 use PowerShell dedup redundent PATH</a></li></ol></li><li class="chapter-item "><a href="../../posts/leetcode/leetcode.html"><strong aria-hidden="true">19.</strong> Leetcode</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/leetcode/rust_leetcode.html"><strong aria-hidden="true">19.1.</strong> rust leetcode</a></li><li class="chapter-item "><a href="../../posts/leetcode/rust_codewar.html"><strong aria-hidden="true">19.2.</strong> rust codewar</a></li><li class="chapter-item "><a href="../../posts/leetcode/swift_codewar.html"><strong aria-hidden="true">19.3.</strong> swift codewar</a></li><li class="chapter-item "><a href="../../posts/leetcode/js_leetcode.html"><strong aria-hidden="true">19.4.</strong> js leetcode</a></li><li class="chapter-item "><a href="../../posts/leetcode/java_leetcode.html"><strong aria-hidden="true">19.5.</strong> java leetcode</a></li><li class="chapter-item "><a href="../../posts/leetcode/rust_huawei.html"><strong aria-hidden="true">19.6.</strong> huawei test</a></li><li class="chapter-item "><a href="../../posts/leetcode/rust_utils.html"><strong aria-hidden="true">19.7.</strong> rust common functions</a></li><li class="chapter-item "><a href="../../posts/leetcode/olympiad_training.html"><strong aria-hidden="true">19.8.</strong> Computer olympiad training</a></li></ol></li><li class="chapter-item "><a href="../../posts/ctf/CTF.html"><strong aria-hidden="true">20.</strong> CTF</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/ctf/CTF_Note.html"><strong aria-hidden="true">20.1.</strong> CTF Note</a></li><li class="chapter-item "><a href="../../posts/ctf/0.1_Web.html"><strong aria-hidden="true">20.2.</strong> Web</a></li><li class="chapter-item "><a href="../../posts/ctf/4.1_Misc.html"><strong aria-hidden="true">20.3.</strong> Misc</a></li><li class="chapter-item "><a href="../../posts/ctf/3.2_PWN_note.html"><strong aria-hidden="true">20.4.</strong> PWN</a></li><li class="chapter-item "><a href="../../posts/ctf/3.1_Crypto.html"><strong aria-hidden="true">20.5.</strong> Crypto</a></li><li class="chapter-item "><a href="../../posts/ctf/3.4_RSA_note.html"><strong aria-hidden="true">20.6.</strong> Rsa attack</a></li><li class="chapter-item "><a href="../../posts/ctf/3.5_Base64.html"><strong aria-hidden="true">20.7.</strong> Base64</a></li><li class="chapter-item "><a href="../../posts/ctf/0.0_SQL Injection Cheatsheet.html"><strong aria-hidden="true">20.8.</strong> SQL Injection Cheatsheet</a></li><li class="chapter-item "><a href="../../posts/ctf/1.1_SQL_injection.html"><strong aria-hidden="true">20.9.</strong> SQL Injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.2_SQL_injection_UNION_attacks.html"><strong aria-hidden="true">20.10.</strong> SQL Injection UNION attacks</a></li><li class="chapter-item "><a href="../../posts/ctf/1.3_Blind SQL injection.html"><strong aria-hidden="true">20.11.</strong> Blind SQL Injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.4_Code Injection.html"><strong aria-hidden="true">20.12.</strong> Code Injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.5_SSRF.html"><strong aria-hidden="true">20.13.</strong> SSRF</a></li><li class="chapter-item "><a href="../../posts/ctf/1.6_OS command injection.html"><strong aria-hidden="true">20.14.</strong> OS command injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.7_Local file inclusion.html"><strong aria-hidden="true">20.15.</strong> Local file inclusion</a></li><li class="chapter-item "><a href="../../posts/ctf/1.8_Remote file inclusion.html"><strong aria-hidden="true">20.16.</strong> Remote file inclusion</a></li><li class="chapter-item "><a href="../../posts/ctf/1.9_CSRFm.html"><strong aria-hidden="true">20.17.</strong> CSRF</a></li><li class="chapter-item "><a href="../../posts/ctf/1.10_NoSQL injection.html"><strong aria-hidden="true">20.18.</strong> NoSQL injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.11_JSON injection.html"><strong aria-hidden="true">20.19.</strong> JSON injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.12_CTF_Web_SQL_Note.html"><strong aria-hidden="true">20.20.</strong> CTF Web SQL Note</a></li><li class="chapter-item "><a href="../../posts/ctf/2.1_XXE.html"><strong aria-hidden="true">20.21.</strong> XXE</a></li><li class="chapter-item "><a href="../../posts/ctf/2.2_XSS.html"><strong aria-hidden="true">20.22.</strong> XSS</a></li><li class="chapter-item "><a href="../../posts/ctf/2.3_Upload File.html"><strong aria-hidden="true">20.23.</strong> Upload File</a></li><li class="chapter-item "><a href="../../posts/ctf/2.4_serialize_unserialize.html"><strong aria-hidden="true">20.24.</strong> serialize unserialize</a></li><li class="chapter-item "><a href="../../posts/ctf/2.5_Race condition.html"><strong aria-hidden="true">20.25.</strong> Race condition</a></li><li class="chapter-item "><a href="../../posts/ctf/zip_plain_text_attack.html"><strong aria-hidden="true">20.26.</strong> Zip plain text attack</a></li><li class="chapter-item "><a href="../../posts/ctf/3.3_pwn HCTF2016 brop.html"><strong aria-hidden="true">20.27.</strong> pwn HCTF2016 brop</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_patch_defense_skill.html"><strong aria-hidden="true">20.28.</strong> PWN Patch defense skill</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_stack_overflow.html"><strong aria-hidden="true">20.29.</strong> PWN stack overflow</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_heap_overflow.html"><strong aria-hidden="true">20.30.</strong> PWN heap overflow</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_format_string_vulnerability.html"><strong aria-hidden="true">20.31.</strong> PWN Format String Vulnerability</a></li><li class="chapter-item "><a href="../../posts/ctf/kali_linux_tutorials.html"><strong aria-hidden="true">20.32.</strong> Kali linux tutorials</a></li><li class="chapter-item "><a href="../../posts/ctf/google_dorks_2023_lists.html"><strong aria-hidden="true">20.33.</strong> Google Dorks 2023 Lists</a></li><li class="chapter-item "><a href="../../posts/ctf/dvwa_writeup.html"><strong aria-hidden="true">20.34.</strong> DVWA WriteUp</a></li><li class="chapter-item "><a href="../../posts/ctf/bwapp_writeup.html"><strong aria-hidden="true">20.35.</strong> bWAPP WriteUp</a></li><li class="chapter-item "><a href="../../posts/ctf/sqlilabs_writeup.html"><strong aria-hidden="true">20.36.</strong> sqlilabs WriteUp</a></li><li class="chapter-item "><a href="../../posts/ctf/pwnable_kr_challenge.html"><strong aria-hidden="true">20.37.</strong> Solutions for pwnable.kr</a></li><li class="chapter-item "><a href="../../posts/ctf/the_periodic_table.html"><strong aria-hidden="true">20.38.</strong> The Periodic Table</a></li><li class="chapter-item "><a href="../../posts/ctf/pwntools_cheatsheet.html"><strong aria-hidden="true">20.39.</strong> Pwntools Cheatsheet</a></li><li class="chapter-item "><a href="../../posts/ctf/gdb_cheatsheet.html"><strong aria-hidden="true">20.40.</strong> GDB Cheatsheet</a></li></ol></li><li class="chapter-item "><a href="../../posts/iltes/iltes.html"><strong aria-hidden="true">21.</strong> ILTES</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/iltes/iltes_writing.html"><strong aria-hidden="true">21.1.</strong> ILTES Writing</a></li></ol></li></ol>
            </div>
            <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
        </nav>

        <!-- Track and set sidebar scroll position -->
        <script>
            var sidebarScrollbox = document.querySelector('#sidebar .sidebar-scrollbox');
            sidebarScrollbox.addEventListener('click', function(e) {
                if (e.target.tagName === 'A') {
                    sessionStorage.setItem('sidebar-scroll', sidebarScrollbox.scrollTop);
                }
            }, { passive: true });
            var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll');
            sessionStorage.removeItem('sidebar-scroll');
            if (sidebarScrollTop) {
                // preserve sidebar scroll position when navigating via links within sidebar
                sidebarScrollbox.scrollTop = sidebarScrollTop;
            } else {
                // scroll sidebar to current active section when navigating via "next/previous chapter" buttons
                var activeSection = document.querySelector('#sidebar .active');
                if (activeSection) {
                    activeSection.scrollIntoView({ block: 'center' });
                }
            }
        </script>

        <div id="page-wrapper" class="page-wrapper">

            <div class="page">
                                <div id="menu-bar-hover-placeholder"></div>
                <div id="menu-bar" class="menu-bar sticky">
                    <div class="left-buttons">
                        <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
                            <i class="fa fa-bars"></i>
                        </button>
                        <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
                            <i class="fa fa-paint-brush"></i>
                        </button>
                        <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
                            <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
                        </ul>
                        <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
                            <i class="fa fa-search"></i>
                        </button>
                    </div>

                    <h1 class="menu-title">Andrew&#x27;s Blog</h1>

                    <div class="right-buttons">
                        <a href="https://gitee.com/dnrops/dnrops" title="Git repository" aria-label="Git repository">
                            <i id="git-repository-button" class="fa fa-github"></i>
                        </a>

                    </div>
                </div>

                <div id="search-wrapper" class="hidden">
                    <form id="searchbar-outer" class="searchbar-outer">
                        <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
                    </form>
                    <div id="searchresults-outer" class="searchresults-outer hidden">
                        <div id="searchresults-header" class="searchresults-header"></div>
                        <ul id="searchresults">
                        </ul>
                    </div>
                </div>

                <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
                <script>
                    document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
                    document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
                    Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
                        link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
                    });
                </script>

                <div id="content" class="content">
                    <main>
                        <h1 id="learn-swift-grammar"><a class="header" href="#learn-swift-grammar">learn swift grammar</a></h1>
<h2 id="common"><a class="header" href="#common">common</a></h2>
<pre><code class="language-swift">import Foundation

typealias i8 = Int8
typealias i16 = Int16
typealias i32 = Int32
typealias i64 = Int64
typealias isize = Int

typealias u8 = UInt8
typealias u16 = UInt16
typealias u32 = UInt32
typealias u64 = UInt64
typealias usize = UInt

typealias f32 = Float
typealias f64 = Double

typealias char = Character
typealias string = String
typealias Option = Optional
typealias bool = Bool

typealias Codable = Decodable &amp; Encodable
typealias Debug = CustomDebugStringConvertible
typealias VecDeque = BidirectionalCollection
typealias Vec = Collection

public enum Results&lt;T&gt; {
 case OK(T)
 case Err(T)
}

public enum Err: Error {
    case notEqual(String)
}
func assertEqual&lt;T:Equatable&gt;(_ result1:T,_ result2:T)-&gt;Result&lt;String,Error&gt;{
    if result1 == result2 {
        return Result.success(&quot;expected \(result1) found \(result2)&quot;)
    }else{
        return Result.failure(Err.notEqual(&quot;expected \(result1) found \(result2)&quot;))
    }
}

func assertEq&lt;T:Equatable&gt;(_ result1:T,_ result2:T){
    let result = assertEqual(result1,result2)
    switch result {
    case .success:
    print(&quot;\(result)&quot;)
    break
    case .failure:
    print(&quot;\(result)&quot;)
    break
    }
}

// assertEq(threeSum([-1, -1, -1, -1, 2, 1, -4, 0], target: 0),[[-1, -1, 2], [-1, 0, 1]])
</code></pre>
<h2 id="basic"><a class="header" href="#basic">basic</a></h2>
<pre><code class="language-swift">
// Number
var int = 10
var float = 12.15

//Boolean
var have = true
var have_not = false

//print type of value
var numberOfPets = 4
print(type(of: numberOfPets))
var numberOfPetsDouble: Double = 4
print(type(of: numberOfPetsDouble))
var inchesDouble = 4.1243
print(type(of: inchesDouble))
var inchesFloat: Float = 4.1243
print(type(of: inchesFloat))

// String
var hstr = &quot;hello world &quot;
hstr.append(&quot;to the world&quot;)// push

//convert number to string by radix
let s0 = String(1635999) // returns &quot;1635999&quot;
let s1 = String(1635999, radix: 10) // returns &quot;1635999&quot;
let s2 = String(1635999, radix: 2) // returns &quot;110001111011010011111&quot;
let s3 = String(1635999, radix: 16) // returns &quot;18f69f&quot;
let s4 = String(1635999, radix: 16, uppercase: true) // returns &quot;18F69F&quot;
let s5 = String(1635999, radix: 17) // returns &quot;129gf4&quot;
let s6 = String(1635999, radix: 36) // returns &quot;z2cf&quot;
print(&quot;s3:\(s3)&quot;)

//String start_with,end_with
let is_start_with = &quot;/demo&quot;.hasPrefix(&quot;/&quot;)
let is_end_with = &quot;demo/&quot;.hasSuffix(&quot;/&quot;)
let long_string = &quot;&quot;&quot;
is_start_with /:\(is_start_with)
is_end_with /:\(is_end_with)
&quot;&quot;&quot;
print(long_string)
//push string
var s7 = &quot;&quot;
s7.write(&quot;write&quot;) //like rusts push_str()
s7.append(&quot;append &quot;) //like rusts push_str()
s7.append(&quot;🌍&quot;) //like rusts push() char
print(&quot;s7:\(s7)&quot;)
//slice string get prefix 前面的元素
var ss7 = s7.prefix(1)
print(&quot;ss7:\(ss7)&quot;)
//slice string get suffix 后面的元素
var ss8 = s7.suffix(1)
print(&quot;ss8:\(ss8)&quot;)
//split string
print(&quot;\(s7.split(separator: &quot; &quot;))&quot;) //[&quot;writeappend&quot;, &quot;🌍&quot;]
print(&quot;\(s7.split(separator: &quot; &quot;,maxSplits:0))&quot;) //[&quot;writeappend&quot;]
print(&quot;\(s7.split(separator: &quot; &quot;,omittingEmptySubsequences:false))&quot;)  //[&quot;writeappend&quot;, &quot;🌍&quot;] 不省略空

let s8 = &quot;Hello!&quot;
let bytes = s8.utf8CString
print(bytes)// Prints &quot;[72, 101, 108, 108, 111, 33, 0]&quot;

// reverse string
let w = &quot;Backwards&quot;
for char in w.reversed() {
    print(char, terminator: &quot;&quot;)
}

var ns1 = String(&quot;demo&quot;)
let numbers = 0...9
let shuffledNumbers = numbers.shuffled()
print(&quot;\(shuffledNumbers)&quot;)



//Array
var emptyAray = [String]()
var names = [&quot;John&quot;, &quot;Sansa&quot;, &quot;Theon&quot;, &quot;Jaime&quot;]
names.insert(&quot;Varys&quot;, at: 2) //insert
names.append(&quot;Robb&quot;) //push back
names.remove(at: 3) //remove at index of 2
let words = [&quot;apple&quot;, &quot;orange&quot;, &quot;banana&quot;]
print(&quot;\(words.count)&quot;)

let new_names = [&quot;Zoey&quot;, &quot;Chloe&quot;, &quot;Amani&quot;, &quot;Amaia&quot;]
let randomName = new_names.randomElement()!

let str = words.joined(separator:&quot; : &quot;)//json array to string

//Dictionaries
var emptyDict = [Int:Double]()
var capitalCities = [&quot;Russia&quot;:&quot;Moscow&quot;,
&quot;Canada&quot;: &quot;Ottawa&quot;, &quot;France&quot;: &quot;Paris&quot;]
capitalCities[&quot;Germany&quot;] = &quot;Berlin&quot;
capitalCities[&quot;Canada&quot;] = &quot;Toronto&quot;
print(capitalCities)
for city in capitalCities{
    print(&quot;The capital city of \(city.key) is \(city.value).&quot;)
}
//if else
var n = 10;
if n&lt;9{
    print(n);
}
else if n==10{
    print(&quot;is \(10)&quot;);
}
else {
}
//simplified ifelse statement
let age = 25
let haveCar = age&gt;28 ? true:false
print(&quot;have \(haveCar)&quot;)

//swich
var country = &quot;Sweden&quot;
switch country {
case &quot;Germany&quot;:
 print(&quot;This country is in Europe&quot;)
case &quot;Sweden&quot;:
 print(&quot;This country is in Europe&quot;)
case &quot;USA&quot;:
 print(&quot;This country is in North America&quot;)
case &quot;India&quot;:
 print(&quot;This country is in Asia&quot;)
case &quot;Egypt&quot;:
 print(&quot;This country is in Africa&quot;)
default:
 print(&quot;Sorry i don't know the continent of this country&quot;)
}
let testscore = 80
var grade:Character
switch testscore {
case 90...100:
 grade = &quot;优&quot;
case 80..&lt;90:
 grade = &quot;良&quot;
case 60..&lt;80:
 grade = &quot;中&quot;
case 0..&lt;60:
 grade = &quot;差&quot;
default:
 grade = &quot;无&quot;
}
print(&quot;Grade = \(grade)&quot;)

// Loop
//for in loop
let listOfNames = [&quot;John&quot;, &quot;Sansa&quot;, &quot;Theon&quot;,&quot;Jaime&quot;, &quot;Robb&quot;, &quot;Thyrion&quot;]
for name in listOfNames {
 print(&quot;listOfNames:\(name)&quot;)
}
//while loop
var startValue = 1
let endValue = 10
while startValue &lt;= endValue {
 print(&quot;startValue \(startValue)&quot;)
 startValue += 1
}
//repeat-while-loop
var m = 2
repeat{
    m*=2
}while m&lt;10
print(&quot;m is: \(m)&quot;)

//Function
func ourFirstFunction() {
 print(&quot;I love Swift!&quot;)
}
ourFirstFunction()
func sayHi(from name:String){
    print(&quot;Hi \(name)&quot;)
}
func sayHi1(name:String){
    print(&quot;Hi \(name)&quot;)
}
sayHi(from:&quot;Andrew&quot;)
sayHi1(name:&quot;Andrew&quot;)

func doubleTheInput(inputValue: Int) -&gt; Int {
 return inputValue*2
}
print(&quot;Double the input:\(doubleTheInput(inputValue:5))&quot;)

// Classes
class Car {
 let horsepower = 100
 let color = &quot;red&quot;
 var numberOfCarDoors = 4
 }
let myCar = Car()
// myCar.colour = &quot;blue&quot; //will error because let means that is constant value
myCar.numberOfCarDoors = 6
print(&quot;my car numberOfCarDoors :\(myCar.numberOfCarDoors)&quot;)

class NewCar {
 let horsepower:Int
 let color:String
 let numberOfCarDoors:Int
 init(horsepower: Int, color: String,numberOfCarDoors: Int) {
    self.horsepower = horsepower
    self.color = color
    self.numberOfCarDoors = numberOfCarDoors
 }
 func engineOn() {
 print(&quot;Engined turned on.&quot;)
 }

 func engineOff() {
 print(&quot;Engine turned off.&quot;)
 }
}

let myNewCar = NewCar(horsepower: 120, color:&quot;green&quot;, numberOfCarDoors: 4)
print(&quot;my new car horsepower:\(myNewCar.horsepower)&quot;)
myNewCar.engineOn()
myNewCar.engineOff()

//Class Inheritance (对象继承)
class Person {
 var firstName: String
 var lastName: String

 init(firstName: String, lastName: String){
    self.firstName = firstName
    self.lastName = lastName
 }

 func greetings() {
    print(&quot;Hi, my name is \(firstName) \(lastName)!&quot;)
 }
}
//Employee 继承Person class
class Employee: Person {
    var staffNummer: Int
    init(staffNummer: Int, firstName: String,lastName: String) {
        self.staffNummer = staffNummer
        super.init(firstName: firstName,lastName: lastName)//继承必须使用super.init()类初始化父类
    }

 func identity() {
    print(&quot;First name \(firstName), Lastname \(lastName), Staff Number \(staffNummer)&quot;)
 }
}
let christine = Employee(staffNummer: 780,firstName: &quot;Christine&quot;, lastName: &quot;Mayer&quot;)
christine.greetings() //调用父类的方法
christine.identity() //调用自己的方法

//Class overriding 重载 （替换父类的方法）
class Student:Person {
    var stuId:String
    init(stuId:String,firstName:String,lastName:String) {
        self.stuId = stuId
        super.init(firstName:firstName,lastName:lastName)
    }
    func sayStuId(){
        print(stuId)
    }
    // overriding greetings
    override func greetings() {
        print(&quot;Hello, how are you?&quot;) //We override the function of the superclass
    }
}
let ryan = Student(stuId:&quot;1820012&quot;,firstName:&quot;Andrew&quot;,lastName:&quot;Ryan&quot;)
ryan.sayStuId()
ryan.greetings()

//Optionals 跟Rust的Option 一样
var ourFirstOptional: Int?
ourFirstOptional = 4
if let insideValue = ourFirstOptional { //just like rusts if let statement
     print(insideValue)
} else {
    print(&quot;Optional contains nil&quot;)
}
var studentOptional:Student?;
studentOptional?.sayStuId() //Nothing will happen
studentOptional?.greetings()//Nothing will happen
studentOptional = Student(stuId:&quot;1820012&quot;,firstName:&quot;Andrew&quot;,lastName:&quot;Ryan&quot;)
studentOptional?.sayStuId() //will print id

//implment stack
struct Stack&lt;T&gt; : ExpressibleByArrayLiteral, CustomDebugStringConvertible {
    var debugDescription: String {
        get {
            return &quot;Stack: \(storage)&quot;
        }
    }
    typealias Element = T
    private var storage: [T] = []
    public init(arrayLiteral elements:Element...) {
        self.storage = elements
    }
    mutating func push(_ item:T) {
        storage.insert(item, at: 0)
    }
    mutating func pop() -&gt; T? {
        guard storage.count &gt; 0 else { return nil }
        return storage.remove(at: 0)
    }
}
//栈 先进后出
var stack = Stack&lt;i8&gt;()
for i in 0...5{
    stack.push(i8(i))
}
print(&quot;pop from stack:\(stack.pop()!)&quot;)
print(&quot;\(stack)&quot;)


learnArgument()

learnInput()

learnDir()

learnJSON()

learnTime()

learnSets()

learnResult()
</code></pre>
<h2 id="learnargument"><a class="header" href="#learnargument">learnArgument</a></h2>
<pre><code class="language-swift">import Foundation

// get arguments
func learnArgument(){
    let args = CommandLine.arguments
    if args.count != 2 {
        print(&quot;Usage: cmd&quot;)
    } else {
    let name = args[1]
        print(&quot;Name: \(name)&quot;)
    }
}
</code></pre>
<h2 id="learninput"><a class="header" href="#learninput">learnInput</a></h2>
<pre><code class="language-swift">import Foundation

/// Inputs
var cin: String {
  readLine()!
}
var cinArray: [Character] {
  Array(cin)
}

extension String {
  func str2(separator: Character = &quot; &quot;) -&gt; (String, String) {
    let a = split(separator: separator).map { String($0) }
    precondition(a.count == 2)
    return (a[0], a[1])
  }
  func strs(separator: Character = &quot; &quot;) -&gt; [String] {
    split(separator: separator).map { String($0) }
  }
  func int() -&gt; Int {
    guard let v = Int(self) else {
      fatalError()
    }
    return v
  }
  func int2(separator: Character = &quot; &quot;) -&gt; (Int, Int) {
    let a = split(separator: separator).map { Int($0)! }
    precondition(a.count == 2)
    return (a[0], a[1])
  }
  func int3(offset: Int = 0, separator: Character = &quot; &quot;) -&gt; (Int, Int, Int) {
    let a = split(separator: separator).map { Int($0)! + offset }
    precondition(a.count == 3)
    return (a[0], a[1], a[2])
  }
  func int4(separator: Character = &quot; &quot;) -&gt; (Int, Int, Int, Int) {
    let a = split(separator: separator).map { Int($0)! }
    precondition(a.count == 4)
    return (a[0], a[1], a[2], a[3])
  }
  func int5(separator: Character = &quot; &quot;) -&gt; (Int, Int, Int, Int, Int) {
    let a = split(separator: separator).map { Int($0)! }
    precondition(a.count == 5)
    return (a[0], a[1], a[2], a[3], a[4])
  }
  func int6(separator: Character = &quot; &quot;) -&gt; (Int, Int, Int, Int, Int, Int) {
    let a = split(separator: separator).map { Int($0)! }
    precondition(a.count == 6)
    return (a[0], a[1], a[2], a[3], a[4], a[5])
  }
  func ints(separator: Character = &quot; &quot;) -&gt; [Int] {
    split(separator: separator).map { Int($0)! }
  }
  func float() -&gt; Float {
    guard let v = Float(self) else {
      fatalError()
    }
    return v
  }
  func float2(separator: Character = &quot; &quot;) -&gt; (Float, Float) {
    let a = split(separator: separator).map { Float($0)! }
    precondition(a.count == 2)
    return (a[0], a[1])
  }
  func float3(separator: Character = &quot; &quot;) -&gt; (Float, Float, Float) {
    let a = split(separator: separator).map { Float($0)! }
    precondition(a.count == 3)
    return (a[0], a[1], a[2])
  }
  func float4(separator: Character = &quot; &quot;) -&gt; (Float, Float, Float, Float) {
    let a = split(separator: separator).map { Float($0)! }
    precondition(a.count == 4)
    return (a[0], a[1], a[2], a[3])
  }
  func floats(separator: Character = &quot; &quot;) -&gt; [Float] {
    split(separator: separator).map { Float($0)! }
  }
  func double() -&gt; Double {
    guard let v = Double(self) else {
      fatalError()
    }
    return v
  }
  func double2(separator: Character = &quot; &quot;) -&gt; (Double, Double) {
    let a = split(separator: separator).map { Double($0)! }
    precondition(a.count == 2)
    return (a[0], a[1])
  }
  func double3(separator: Character = &quot; &quot;) -&gt; (Double, Double, Double) {
    let a = split(separator: separator).map { Double($0)! }
    precondition(a.count == 3)
    return (a[0], a[1], a[2])
  }
  func double4(separator: Character = &quot; &quot;) -&gt; (Double, Double, Double, Double) {
    let a = split(separator: separator).map { Double($0)! }
    precondition(a.count == 4)
    return (a[0], a[1], a[2], a[3])
  }
  func doubles(separator: Character = &quot; &quot;) -&gt; [Double] {
    split(separator: separator).map { Double($0)! }
  }
}

func learnInput(){
  let in_string = cin
  let in_string_arr = in_string.strs(separator:&quot; &quot;)
  print(&quot;in_string_arr: \(in_string_arr)&quot;)
}

</code></pre>
<h2 id="learndir"><a class="header" href="#learndir">learnDir()</a></h2>
<pre><code class="language-swift">import Foundation

func learnDir(){
    let homeDir = NSHomeDirectory()
    let userName = NSUserName()
    if let home_user = NSHomeDirectoryForUser(&quot;andrew&quot;){
        print(&quot;\(homeDir),\(userName),\(home_user)&quot;)
    }
    let pwd = URL(fileURLWithPath: &quot;./&quot;)
    print(&quot;\(pwd)&quot;)
}
</code></pre>
<h2 id="learnjson"><a class="header" href="#learnjson">learnJSON</a></h2>
<pre><code class="language-swift">import Foundation


struct Employeer: Codable {
    var name:String
    var id: Int
    var mToy:Toy
}

struct Toy:Codable {
    var name:String
}

extension Employeer:Debug {
    var debugDescription: String {
        return name + &quot;(&quot; + String(id) + &quot;): &quot; + mToy.name
    }
}

func learnJSON(){
/// encode instance to jsonString
let toyA = Toy(name: &quot;Teddy Bear&quot;)
let employeeA = Employeer(name: &quot;EmployA&quot;, id:1, mToy:toyA)
let jsonEncoder = JSONEncoder()
let jsonData = try? jsonEncoder.encode(employeeA)
// jsonData contains an unreadable representation of employeeA
print(&quot;jsonData: \(String(describing:jsonData))&quot;)
let jsonString = String(data: jsonData!, encoding: .utf8)
print(&quot;jsonString: \(String(describing:jsonString))&quot;)

/// decode jsonString to instance
let jsonDecoder = JSONDecoder()
let employeeADecoded = try? jsonDecoder.decode(Employeer.self, from: jsonData!)
print(employeeADecoded!)//result

/*
jsonData: Optional(54 bytes)
jsonString: Optional(&quot;{\&quot;name\&quot;:\&quot;EmployA\&quot;,\&quot;id\&quot;:1,\&quot;mToy\&quot;:{\&quot;name\&quot;:\&quot;Teddy Bear\&quot;}}&quot;)
EmployA(1): Teddy Bear
*/
}
</code></pre>
<h2 id="learntime"><a class="header" href="#learntime">learnTime</a></h2>
<pre><code class="language-swift">import Foundation

extension Date {
/// 获取当前 秒级 时间戳 - 10位
var timeStamp : String {
    let timeInterval: TimeInterval = self.timeIntervalSince1970
    let timeStamp = Int(timeInterval)
    return &quot;\(timeStamp)&quot;
}
/// 获取当前 毫秒级 时间戳 - 13位
var milliStamp : String {
    let timeInterval: TimeInterval = self.timeIntervalSince1970
    let millisecond = CLongLong(round(timeInterval*1000))
    return &quot;\(millisecond)&quot;
}
}
func learnTime(){
//当前时间
let dformatter = DateFormatter()
dformatter.dateFormat = &quot;yyyy年MM月dd日 HH:mm:ss&quot;
print(&quot;当前日期时间：\(dformatter.string(from: Date()))&quot;)

//TimeStamp 时间戳
 let millisecond = Date().milliStamp
 print(&quot;当前毫秒级时间戳是 millisecond == &quot;,millisecond)
 let timeStamp = Date().timeStamp
 print(&quot;当前秒级时间戳是 timeStamp == &quot;,timeStamp)

 //将时间戳转为日期时间
let timeStamp1 = 1463637809
print(&quot;时间戳：\(timeStamp1)&quot;)
let timeInterval:TimeInterval = TimeInterval(timeStamp1)
let date = Date(timeIntervalSince1970: timeInterval)//转换为时间
let dformatter1 = DateFormatter()
dformatter1.dateFormat = &quot;yyyy年MM月dd日 HH:mm:ss&quot;
print(&quot;对应的日期时间：\(dformatter1.string(from: date))&quot;)//格式话输出

//获取当前时区
let zone = NSTimeZone.system
print(&quot;zone = \(zone)&quot;)

//获取当前时区和GMT的时间间隔
let interval = zone.secondsFromGMT()
print(&quot;interval = \(interval)&quot;)// 当前时区和格林威治时区的时间差 8小时 = 28800秒
print(&quot;interval = \(interval/3600)&quot;)// 输出当前系统时区

//获取当前系统时间
let now = Date().addingTimeInterval(TimeInterval(interval))
print(&quot;now time = \(now)&quot;)// 是Date格式不是String
}
/**
输出结果
当前日期时间：2022年12月21日 00:42:10
当前毫秒级时间戳是 millisecond ==  1671554530990
当前秒级时间戳是 timeStamp ==  1671554530
时间戳：1463637809
对应的日期时间：2016年05月19日 14:03:29
*/
</code></pre>
<h2 id="learnsets"><a class="header" href="#learnsets">learnSets</a></h2>
<pre><code class="language-swift">import Foundation

func learnSets(){

var primes: Set = [2, 3, 5, 7,55]
if primes.isEmpty {
    print(&quot;No primes!&quot;)
} else {
    primes.insert(77)
    print(&quot;We have \(primes.count) primes.&quot;)
}
let primesSum = primes.reduce(0, +)
let primeStrings = primes.sorted().map(String.init)
print(&quot;primesSum:\(primesSum)&quot;)
print(&quot;primeStrings:\(primeStrings)&quot;)

primes.remove(77)
primes.removeFirst()
if let index = primes.firstIndex(of:55){
    primes.remove(at:index)
}

let smallNums = primes.filter { $0 &lt; 5 }
print(&quot;smallNums:\(smallNums)&quot;)


// Tests whether primes is a subset of a Range&lt;Int&gt;
print(primes.isSubset(of: 0..&lt;10))
// Prints &quot;true&quot;

// Performs an intersection with an Array&lt;Int&gt;
let favoriteNumbers = [5, 7, 15, 21]
print(primes.intersection(favoriteNumbers)) //集合的交集
}
</code></pre>
<h2 id="learnresult"><a class="header" href="#learnresult">learnResult</a></h2>
<pre><code class="language-swift">func getResult()-&gt;Results&lt;String&gt; {
    Results.OK(&quot;ok&quot;)
}
func learnResult(){
    print(&quot;\(getResult())&quot;)
}
</code></pre>
<h2 id="impliment-like-pythons-system-function-with-swift"><a class="header" href="#impliment-like-pythons-system-function-with-swift">impliment like pythons system function with swift</a></h2>
<pre><code class="language-swift">//python's os.system()
import Foundation


#if os(Linux)
  func system(_ command: String) -&gt; Void {
    let task = Process()
    task.executableURL = URL(fileURLWithPath: &quot;/bin/sh&quot;)
    task.arguments = [&quot;-c&quot;, command]
    do {
        try task.run()
        task.waitUntilExit()
    } catch {
        print(&quot;Error: \(error.localizedDescription)&quot;)
    }
  }
  system(&quot;ls&quot;)
#elseif os(macOS)
  func system(_ command: String) -&gt; Void {
    let task = Process()
    task.executableURL = URL(fileURLWithPath: &quot;/bin/sh&quot;)
    task.arguments = [&quot;-c&quot;, command]
    do {
        try task.run()
        task.waitUntilExit()
    } catch {
        print(&quot;Error: \(error.localizedDescription)&quot;)
    }
  }
  system(&quot;ls&quot;)
#elseif os(Windows)
  func system_cmd(_ command: String) -&gt; Void {
      let task = Process()
      task.executableURL = URL(fileURLWithPath: &quot;cmd&quot;)
      task.arguments = [&quot;/c&quot;, command]
      do {
          try task.run()
          task.waitUntilExit()
      } catch {
          print(&quot;Error: \(error.localizedDescription)&quot;)
      }
  }
  system_cmd(&quot;ping dnrops.gitee.io&quot;)
  func system_powershell(_ command: String) -&gt; Void {
      let task = Process()
      task.executableURL = URL(fileURLWithPath: &quot;powershell&quot;)
      task.arguments = [&quot;-Command&quot;, command]
      do {
          try task.run()
          task.waitUntilExit()
      } catch {
          print(&quot;Error: \(error.localizedDescription)&quot;)
      }
  }
  system_powershell(&quot;ping dnrops.gitee.io&quot;)
#else
    let platform = &quot;Unknown&quot;
    print(&quot;This operating system is not supported.&quot;)
#endif

</code></pre>

                    </main>

                    <nav class="nav-wrapper" aria-label="Page navigation">
                        <!-- Mobile navigation buttons -->
                            <a rel="prev" href="../../posts/swift/swift.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
                                <i class="fa fa-angle-left"></i>
                            </a>

                            <a rel="next" href="../../posts/swift/swift_extensions.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
                                <i class="fa fa-angle-right"></i>
                            </a>

                        <div style="clear: both"></div>
                    </nav>
                </div>
            </div>

            <nav class="nav-wide-wrapper" aria-label="Page navigation">
                    <a rel="prev" href="../../posts/swift/swift.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
                        <i class="fa fa-angle-left"></i>
                    </a>

                    <a rel="next" href="../../posts/swift/swift_extensions.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
                        <i class="fa fa-angle-right"></i>
                    </a>
            </nav>

        </div>



        <script>
            window.playground_line_numbers = true;
        </script>

        <script>
            window.playground_copyable = true;
        </script>

        <script src="../../ace.js"></script>
        <script src="../../editor.js"></script>
        <script src="../../mode-rust.js"></script>
        <script src="../../theme-dawn.js"></script>
        <script src="../../theme-tomorrow_night.js"></script>

        <script src="../../elasticlunr.min.js"></script>
        <script src="../../mark.min.js"></script>
        <script src="../../searcher.js"></script>

        <script src="../../clipboard.min.js"></script>
        <script src="../../highlight.js"></script>
        <script src="../../book.js"></script>

        <!-- Custom JS scripts -->
        <script src="../../src/js/custom.js"></script>


    </div>
    </body>
</html>
